
Artem
10.05.2018
14:09:56
плюс каналы и вся синхронизация потоков, нифига он не также выглядит

Pavel
10.05.2018
14:10:24

Artem
10.05.2018
14:10:52
ну так у тебя по сути два отдельных процесса, в случае того же Го да они легковестные и скорее абстрактные, но все же изолированные

Google

Artem
10.05.2018
14:11:00
тебе нужно же синхронизировать результат

Pavel
10.05.2018
14:11:24
Я подозреваю что принципиальная разница в том что эти корутины/файберы должны уметь сохранять состояние на стеке. Чего генераторы не умеют.

Artem
10.05.2018
14:14:11
совсем не обязательно хранить состояние. Это же конкурентность, в большинстве случаев просто независимое исполнение и в случае получения команды он вешает исползенение до получения результата

Pavel
10.05.2018
14:14:29
Вы не отвечаете на мой ответ

Artem
10.05.2018
14:15:10
но я все равно не пойму сути вопроса, что значит выглядит как синхронный или асинхронный.

Pavel
10.05.2018
14:16:29
Еще раз, вот пример:
while ($socket = yield $server->accept()) {
$clientHandler($socket);
}
Вот пример на go
for {
conn, err := ln.Accept()
if err != nil {
// handle error
}
go handleConnection(conn)
}

Artem
10.05.2018
14:17:09

Pavel
10.05.2018
14:17:15
Вопрос: можно ли убрать слово yield из пхп кода и почему без него нельзя обойтись? И почему можно в го ?
тут же нет ничего асинхронного
Здесь все асинхронное, это пример из асинхронного сервера https://github.com/amphp/socket/blob/master/examples/simple-http-server.php

Artem
10.05.2018
14:18:14
ты просто смотришь пользовательский код, тебе нужно в примере с Го пойти в реализацию handleConnection
вообще yield это скорее всего просто способ показать, что он жив и готов принимать соединения. Твоя же задача в первую очередь избежать бесконечного цикла и обеспецичть graceful shutdown

Google

Artem
10.05.2018
14:20:30
но ты явно не в ту сторону вопрос формулируешь. в данном случае генератор -это просто конструкция используемая для блокировки потока исполнения, скорее всего
Go отличается только тем, что он на каждый чих просто запускает паралельный процесс, который весит меньше чем у других.

Pavel
10.05.2018
14:22:15
Вопрос сформулирован вполне чотко и конкретно - можно ли с помощью генераторов так организовать event loop чтобы пользовательский код был без yield и мог работать асинхронно
Потому что если изобретут файберы (а сейчас активно ведется работа по их внедрению), то так точно можно будет сделать.

Artem
10.05.2018
14:24:57

Pavel
10.05.2018
14:26:32
> как ты без него что то сделашь...
Вот подробный ответ на это меня и интересует.
И на данный момент я пришел к выводу что если бы генератор умел сохранять своей состояние в стеке как-то, то это было бы реально организовать. Вот в чем принципиальная компьютер-саенс разница.

Artem
10.05.2018
14:27:42
> если бы генератор умел сохранять своей состояние в стеке как-то
это был бы уже итератор )

Pavel
10.05.2018
14:27:57
Ну итераторы в пхп есть и тем не менее

Artem
10.05.2018
14:28:28
суть генератора же в том, чтобы последовательно проходить по объекту храня только текущее состояние в памяти

Pavel
10.05.2018
14:28:43
Файберы это то что даже в низкоуровневых языках делается через ассемблер, но не через средства самого языка. То есть сделать такое доступными конструкциями языка нереально.

Artem
10.05.2018
14:29:56
ну если речь именно о том, как они на самом деле запускают процессы и потоки, то это сильно зависит от реализации, кто то потоки ОС использует, кто то свои в VM городит и не важно какими средствами. Генератор же это просто абстракция.
Вопрос же не в том, как генератор будет выполнять код асинхронно, а как ты потом синхронзируешь изменения
тебе в любом случае придется ставить локи и тормозить исполнение следующей итерации, иначе будут коллизии

Pavel
10.05.2018
14:31:23

Artem
10.05.2018
14:31:39

Pavel
10.05.2018
14:32:19
В программировании зелёные потоки (англ. green threads) — это потоки выполнения, управление которыми вместо операционной системы выполняет виртуальная машина (ВМ). Green threads эмулируют многопоточную среду, не полагаясь на возможности ОС по реализации легковесных потоков. Управление ими происходит в пользовательском пространстве, а не пространстве ядра, что позволяет им работать в условиях отсутствия поддержки встроенных потоков.
Тем не менее, по определению это то что никак не лезет ни в процессы ни в потоки, а справляется собственными силами.

Artem
10.05.2018
14:33:50
дело в том что если речь о горутинах, а не корутинах, т.е. именно реализации в Go, то там именно native threads используются
тут есть хорошее объяснение https://blog.nindalf.com/posts/how-goroutines-work/

Google

Pavel
10.05.2018
14:34:40
Это уже компилятор умеет их растаскивать по тредам, но все еще в одном треде горутины работают прекрасно асинхронно, переключая свой контекст

Gleb
10.05.2018
14:34:43
Жесть. Смотрю запрос в бд выполняется запрос 1.5 минуты))))

Pavel
10.05.2018
14:35:16
И почему то там не надо писать conn, err := await ln.Accept()

Artem
10.05.2018
14:36:12

Pavel
10.05.2018
14:36:50

Artem
10.05.2018
14:38:01

Pavel
10.05.2018
14:38:19
ну возьми js вместо go

Artem
10.05.2018
14:38:26
но это только один механизм, там есть мьютексы и простые каналы могут вешать поток, но опять таки это именно вопросы синхронизации

Pavel
10.05.2018
14:38:59
async function add1(x) {
const a = await resolveAfter2Seconds(20);
const b = await resolveAfter2Seconds(30);
return x + a + b;
}
Вот пример из js

Artem
10.05.2018
14:39:21
js это вообще ад, там тупо колбеки же. Они просто не завершают процесс и ждут пока обсервер получит нотификицию
и не важно await или колбек в ф-ии, суть та же -весь процесс висит и ждет

Pavel
10.05.2018
14:39:48
Зачем ты столько текста пишешь но ответа так и не дал )

Artem
10.05.2018
14:40:42
я не понимаю вопроса совершенно. Ты говоришь о генераторах, которые есть абстракция и синтаксическая конструкция, а асинхронность -это уже уровень компилятора или интерпретатора

Pavel
10.05.2018
14:41:13
Ну вот на генераторах вполне себе делают асинхронный код
Есть вот amphp
Конечно писать через yield вызовы гораздо лучше чем колбеки городить. Но без них была бы вообще красота.

Artem
10.05.2018
14:42:54
я не понимаю асинхронности в одном потоке исполнения.
Если ты в генераторе выполняешь какой -то запрос, то тебе нужно явно ходить и проверять состояние. Если код асинхронный, то просто запускается паралельный процесс, который в случае получения результата вернет состояние в основной, но это не влияет на испольнение любого другого участка кода

Pavel
10.05.2018
14:44:20
nodejs все в одном треде обрабатывает. Как и пшп

Google

Artem
10.05.2018
14:45:25
ну так даже если ты запускаешь на одном процессоре это не значит что оно работает в одном процессе. Он же разделяет память
все эти yield в генераторе это просто возращаемые значение, т.е. ты запуская одновременно несколько раз next() по сути просто несколько раз вызываешь функцию в разных состояниях. Зачем тут вообще генератор? ну напиши 10 функций на каждый yeild и результат тот же

Pavel
10.05.2018
14:47:24

Artem
10.05.2018
14:50:04
Как это не значит? Он будет плодить процессы?
ну да, при чем по желанию в зависимости от своей потребности. я никогда туда не лез и не уверен можно ли это контролировать. опция GOMAXPROCS -это именно колличество потоков операционной системе, но в рамках одного он сколько хочешь процессов может запустить, но я не уверен, можен он просто копию создает я не знаю зачем мне это знаять )
ну и да GOMAXPROCS равен 1 по умолчанию

Pavel
10.05.2018
14:52:07
По-моему ты втираешь какую-то дичь.? По твоему тексту выходит что в рамках одного потока он может создать несколько процессов.

Artem
10.05.2018
14:55:57
ну у него не совсем рандомное, но недетерминированно поведение. Я понятия если честно не имею создает ли он процесс внутри ОС, то, что потоки нативные это факт и то, но вообще там лежит в основе CSP но опять таки это модель взаимодействия скорее

Pavel
10.05.2018
14:56:54
Ну конечно же он создает процесс. Один процесс когда запускаешь бинарник.

Admin
ERROR: S client not available

Pavel
10.05.2018
14:57:12
А внутри процесса создается GOMAXPROCS тредов
тред==поток==thread==нить
?

Artem
10.05.2018
14:59:55
ну вот внутри этого 1 треда он и создает свои процессы по каждой горутине, только это конечно не процессы ОС уже, это горутины, т.е. то что есть реализация CSP(Communicating Sequential Processes) process
но вообще да по сути эти горутины это просто "зеленые потоки". Хоть и с оговорками

Alexander
10.05.2018
15:04:28
чат по php.....

?
10.05.2018
15:05:39
Всем привет, подскажите пожалуйста как в одной ячейке массива передать сразу несколько переменных?
$data = array (
'userdata' => $row1.';'.$row2;'.$sesid,
)

Alexander
10.05.2018
15:07:08
$data = [
'userdata' => [$row1, $row2, $sesid],
];

?
10.05.2018
15:07:41
Спасибо, а не подскажешь как потом их получить?

Alexander
10.05.2018
15:08:01
$data['userdata'][0]
$data['userdata'][1]
$data['userdata'][3]
но как по мне лучше именованые ключи
$data = [
'userdata' => [
'row1' => $row1,
'row2' => $row2,
'sessid' => $sessid
]
]
и получать
$data['userdata']['row1']
$data['userdata']['row2']
$data['userdata']['sessid']

?
10.05.2018
15:10:38
Огромная благодарность за помощь

Google

dypa
10.05.2018
15:24:49

Сергей З.
10.05.2018
16:04:25

Андрей
10.05.2018
16:20:38

dypa
10.05.2018
16:49:52

Adel
10.05.2018
17:10:41
Все. последняя полезная статья на хабр с конфы :) https://habr.com/company/devconf/blog/358286/ довольно кратко и по делу Юра, который реально знает что такое хайлоад(работал в badoo), сделал обзор по трем перспективным базам для хайлоада.

Дмитрий
11.05.2018
05:28:29
кто нибудь использует clickhouse + php у себя? клиентов не так уж и много на php под это дело, а если есть, то нашёл только работающие через http api.

Серёга
11.05.2018
05:31:51

Дмитрий
11.05.2018
05:33:46

Серёга
11.05.2018
05:34:31
И чей-то дописывал и хттп слал и готовый использовал

Дмитрий
11.05.2018
05:35:11
https://github.com/8bitov/clickhouse-php-client
помочь чтоли человеку) раз уже всё равно писать)
или ты другой юзал?

Серёга
11.05.2018
05:36:53
На тот момент мне этот больше понравился
https://github.com/smi2/phpClickHouse

Alexey
11.05.2018
06:16:16
Можете по XSLT канал посоветовать?
И книжку от начинающего и до гуру чтобы прокачаться :)

Plomipu
11.05.2018
06:54:24
Артём и остальные. Всё тщетно.
1. в php.ini прописал:
mbstring.internal_encoding = UTF-8
2. в httpd.conf прописал:
AddDefaultCharset utf-8
3. в php файле, где я применяю скрипт чтение имён директорий и получение списка ссылок на них в json формате даже если названия некоторых директорий русские прописал:
header('content-type: application/json; charset=utf-8');
4. файл php сохранён в utf-8 без BOM.
5. Даже в самой строчке кода конвертятся символы в utf-8:
$img_dirs[$i] = utf8_encode(dirname(str_replace(getcwd(),dirname($_SERVER['PHP_SELF']),$found_file)));
Мне выводится такая json строка:
две последние ссылки имеют закодированные в utf-8 коды символов, но когда они интерпретируются из такого формата, то получаются кракозябры. Что опять надо настроить/достроить на серваке httpd ? Что ему не нравится ?? Уже фантазии не хватает, как мне utf-8 вытянуть.

Alexander
11.05.2018
07:08:10
а
json_encode($array, JSON_UNESCAPED_UNICODE);
Пробовали?

Artem
11.05.2018
07:13:25